Technical Q&A QTMCC19
Image Decompressor Data-loading Procs


Q: ÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇΔÇΔLJDžégǧÉfÉRÉìÉvÉåÉbÉTÉRÉìÉ|Å[ÉlÉìÉgÇãLèqǵǃǮÇËÅAÇ∑Ç◊ǃÇÃÉCÉÅÅ[ÉWÉfÅ[É^ÇêLí£ëOÇ…íPàÍÇÃÉoÉbÉtÉ@Ç…ì«Ç›çûÇfiïKóvǙdžÇËÇ‹Ç∑ÅBImageCodecPreflight Çé¿ëïÇ∑ÇÈç€Ç…ÅAbandMin ÇämǩDžÉCÉÅÅ[ÉWÇÃÉtÉãÉnÉCÉgÇ…ê›íËǵNjǵÇΩÅBǵǩǵÅAImageCodecBeginBand Ç…ìnÇ≥ÇÍÇΩÉoÉbÉtÉ@ÉTÉCÉYÇÕ 32K Ç…ê›íËÇ≥ÇÍǃǮÇËÅAÉfÉBÉXÉNè„ÇÃÉCÉÅÅ[ÉWÇÃÉTÉCÉYDžǻǡǃǢNjÇπÇÒÅBDZÇÍÇÕÇ»Ç∫Ç≈ǵÇÂǧǩÅAÇ‹ÇΩÅAǫǧÇ∑ÇÍÇŒÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇê≥ǵÇ≠åƒÇ—èoÇπÇÈÇÃÇ≈ǵÇÂǧǩÅH

A: FDecompressImageÅiÇ‹ÇΩÇÕ Image Compression Manager DždžÇÈä÷òAÇ∑ÇÈä÷êîÇà 1 ǬÅjÇÃåƒÇ—èoǵë§ÇÕÅAà≥èkÉfÅ[É^ÇÃÇ∑Ç◊ǃÇíPàÍÇÃÉoÉbÉtÉ@Ç…ópà”Ç∑ÇÈÇ©ÅAÇ‹ÇΩÇÕÅAÇÊÇËè¨Ç≥Ç»ÉoÉbÉtÉ@ÇΔÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇópà”Ç∑ÇÈÇ©ÇëIǑDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

ÉfÅ[É^ÉçÅ[Éhä÷êîÇÃÉoÉbÉtÉ@ÇÕç≈í· 32K Ç≈džÇËÅAcodecMinimumDataSize ÇÕ 32K ÇΔǵǃíËã`Ç≥ÇÍǃǢNjÇ∑ÅB

Ç«ÇøÇÁÇÃÉÇÅ[ÉhLJçlǶÇÁÇÍÇÈÇÃÇ≈ÅAÉCÉÅÅ[ÉWÉfÉRÉìÉvÉåÉbÉTÉRÉìÉ|Å[ÉlÉìÉgÇÕóºï˚ÇÃÉÇÅ[ÉhÇÉTÉ|Å[ÉgÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBåªç›ÇÃÉoÅ[ÉWÉáÉìÇà QuickTime Ç≈ÇÕÅAÉrÉfÉIÉÅÉfÉBÉAÉnÉìÉhÉâÇÕÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇégǧDZÇΔÇÕdžÇËÇ‹ÇπÇÒÇ™ÅAäÓñ{ÇÃÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇÕèÌÇ…ÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇégǢNjÇ∑ÅB

ÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÉCÉìÉ^ÉtÉFÅ[ÉXÇÕÅAÉCÉÅÅ[ÉWÉfÉRÉìÉvÉåÉbÉTÉRÉìÉ|Å[ÉlÉìÉgÇ…ÇÊǡǃégǢǂÇ∑Ç¢ÇÊǧDžê›åvÇ≥ÇÍǃǮÇËÅAì¸óÕÉfÅ[É^Ç 1 âÒÇæÇØéÛÇØìnÇ∑ïKóvǙdžÇÈÇæÇØÇ≈Ç∑ÅBÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇ™íÒãüÇ≥ÇÍÇÈèÍçáÇÕÅAÉfÅ[É^ÇÃì«Ç›éÊÇËå≥ÇΔÇ»ÇÈÉ|ÉCÉìÉ^ÇégǡǃíËä˙ìIÇ…åƒÇ—èoǵÅAïKóvÇΔévÇÌÇÍÇÈç≈ëÂå¿ÇÃêÊì«Ç›ÇéwíËÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBïKóvÇ…âûÇ∂ǃÅAÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇÕÉ|ÉCÉìÉ^ÇçXêVǵǃÅAéñëOÇ…ÉfÅ[É^Ç™è\ï™Ç…ë∂ç›Ç∑ÇÈèÛë‘DžǵNjÇ∑ÅB

ǵǩǵÅAÇ¢Ç≠ǬǩÇÃóùóRÇ…ÇÊÇËÅAÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇ÷ÇÃåƒÇ—èoǵÇÉfÉRÉìÉvÉåÉbÉTÇ…ìùçáÇ≈ǴǻǢèÍçáǙdžÇËÇ‹Ç∑ÅBÇΩÇΔǶnjÅAé¿ç€ÇÃêLí£èàóùÇ™ÅAèCê≥ïsâ¬î\Ç»ÉRÅ[ÉhÇ‚ÉnÅ[ÉhÉEÉFÉAÇ…ÇÊǡǃé¿çsÇ≥ÇÍÇÈèÍçáÇ≈Ç∑ÅBDZÇÃÇÊǧǻèÍçáÇÕÅAÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇï°êîâÒåƒÇ—èoǵÅAñàâÒ p->bufferSize ÉoÉCÉgÇóvãÅÇ∑ÇÈDZÇΔÇ…ÇÊÇËÅAÉtÉåÅ[ÉÄëSëÃÇÉoÉbÉtÉ@Ç…ÉRÉsÅ[Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

äÓñ{ÇÃÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇÕÅAÉCÉÅÅ[ÉWãLèqÇà dataSize Ç…à≥èkÉfÅ[É^ëSëÃÇÃé¿ç€ÇÃÉTÉCÉYÇ™ä‹Ç‹ÇÍǃǢÇÈDZÇΔÇèÌÇ…ï€èÿǵNjÇ∑ÅB

à»â∫Ç…ÅADZÇÃédëgÇ›Çé¶ÇµÇ‹Ç∑ÅB

OSErr ICMDataProcPtr(Ptr *dataP, long bytesNeeded, long refcon);


  1. ÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇåƒÇ—èoÇ∑ÇΔÇ´Ç…ÅAÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇÃÉoÉbÉtÉ@Ç÷ÇÃÉ|ÉCÉìÉ^ÇÃÉAÉhÉåÉXÇìnǵNjÇ∑ÅBÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇÕÅAÉ|ÉCÉìÉ^Ç™åªç›Ç‡ÇªÇÃÉoÉbÉtÉ@ÇéwǵǃǢÇÈǩǫǧǩÇÉ`ÉFÉbÉNǵÅAÉ|ÉCÉìÉ^ÇÃåªç›ÇÃílÇégǡǃÉfÅ[É^ǙǫÇÍÇæÇØè¡îÔÇ≥ÇÍÇΩÇ©ÇåvéZǵNjÇ∑ÅB
Ptr dataPtr = drp->codecData;
Size bytesConsumed;
Boolean done = false;

while(! done) {
  if(dataProc) {
    err = CallICMDataProc(dataProc, &dataPtr, 10000, dataRefCon);
    if(err) goto bail;
  }
    err = consumeUpTo10000Bytes(..., dataPtr, &bytesConsumed, &done);
    if(err) goto bail;
    dataPtr += bytesConsumed;
}


  1. É|ÉCÉìÉ^ÇÃÉAÉhÉåÉXÇÃë„ÇÌÇËÇ… NULL ÇìnÇ∑ÇΔì¡ï Ç»à”ñ°Ç…Ç»ÇËÇ‹Ç∑ÅBbytesNeeded ÉpÉâÉÅÅ[É^Ç™É[ÉçÇÃèÍçáÇÕÅAÉfÅ[É^ÉXÉgÉäÅ[ÉÄÇÃêÊì™Ç…ÉäÉZÉbÉgÇ∑ÇÈDZÇΔÇóvãÅǵÅAbytesNeeded ÉpÉâÉÅÅ[É^Ç™É[Éçà»äOÇÃèÍçáÇÕÅAǪÇÃÉoÉCÉgêîï™ÇÃëäëŒìIÇ»ÉVÅ[ÉNÇóvãÅǵNjÇ∑ÅBëäëŒìIÇ»ÉVÅ[ÉNÇÃëOÇ…ÅAÉfÅ[É^ÉçÅ[ÉhÉvÉçÉVÅ[ÉWÉÉÇÕÅAǪÇÃÉoÉbÉtÉ@íÜÇÃÉ|ÉCÉìÉ^ÇÃà íuÇîFéØÇµÇƒÇ¢ÇÈDZÇΔÇämîFÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃämîFÇÕÅAÉ[ÉçÉoÉCÉgÇóvãÅÇ∑ÇÈÉfÅ[É^ÉvÉçÉVÅ[ÉWÉÉÇåƒÇ—èoÇ∑DZÇΔÇ…ÇÊÇËçsǶNjÇ∑ÅB

ÉfÅ[É^ÉXÉgÉäÅ[ÉÄÇÃêÊì™Ç÷ÇÃÉäÉZÉbÉgÅF

  err = CallICMDataProc(dataProc, NULL, 0, dataRefCon);


ëäëŒìIÇ»ÉVÅ[ÉNÅF

  err = CallICMDataProc(dataProc, &dataPtr, 0, dataRefCon);
  err = CallICMDataProc(dataProc, NULL, relativeSeekAmount, dataRefCon);


ǪÇÃdžÇΔÇÃì«Ç›éÊÇËÅF

  err = CallICMDataProc(dataProc, &dataPtr, bytesNeeded, dataRefCon);


  1. äÑÇËìñǃÇΩÉÅÉÇÉäÉuÉçÉbÉNÇ…ÉfÅ[É^ÇÉçÅ[ÉhÇ∑ÇÈÇ…ÇÕÅABeginBand ÉãÅ[É`ÉìÇ≈éüÇÃèàóùÇé¿çsǵNjÇ∑ÅB
Ptr dataPtr = drp->codecData;
Ptr bufferPtr = myBuffer;
Size bytesRemaining = myBufferSize;

while(bytesRemaining > 0) {
  Size bytesToRequest;
  if(bytesRemaining < codecMinimumDataSize)
    bytesToRequest = bytesRemaining;
  else
    bytesToRequest = codecMinimumDataSize;

  err = CallICMDataProc(dataProc, &dataPtr, bytesToRequest, dataRefCon);
  if(err) goto bail;
  BlockMoveData(dataPtr, bufferPtr, bytesToRequest);
  dataPtr += bytesToRequest;
  bufferPtr += bytesToRequest;
  bytesRemaining -= bytesToRequest;
}


[2003 îN 7 åé 10 ì˙]